cython并行性能

您所在的位置:网站首页 numpy 并行 cython并行性能

cython并行性能

2023-03-26 21:34| 来源: 网络整理| 查看: 265

cython通过编译为C程序提高性能有很多例子,通过OpenMP并行的性能没那么多。 今天尝试了一下似乎gcc对parallelism reduction优化的很厉害,加上OpenMP并行可以提高20倍性能(相对于pandas rolling),这不是简单的2 core带来的性能提高。

滚动求和 rolling sum的例子 最简单的实现pandas.rolling,通过操作numpy array,速度也还算能接受。

# test_para.py import numpy as np #import pyximport; pyximport.install(reload_support=True, setup_args={"include_dirs":np.get_include()}) import timeit import pandas as pd import para.cpara as cpara X = -1 + 2*np.random.rand(100000) ss = pd.Series(X) ss.rolling(100).apply(np.sum,raw=True) print('==============') print('multi thread') start_time = timeit.default_timer() sum_cython=pd.Series(cpara.window_sum(X, 100)) print(timeit.default_timer() - start_time) print('single thread') start_time = timeit.default_timer() sum_pandas=ss.rolling(100).apply(np.sum,raw=True) print(timeit.default_timer() - start_time) print(np.max(np.abs(sum_cython - sum_pandas)))

cython源文件

# cpara.pyx cimport cython import numpy as np from cython.parallel import prange,parallel cimport numpy as cnp from libc.stdlib cimport malloc @cython.boundscheck(False) def window_sum(cnp.ndarray[double, ndim=1] arr, int window): cdef h = np.zeros_like(arr) cdef int imax = arr.shape[0] cdef double *buffer = malloc(imax * sizeof(double)) cdef double result = 0.0 cdef int i, j with nogil, parallel(): for i in prange(imax, schedule='dynamic'): buffer[i] = 0.0 if i >= window-1: for j in range(window): buffer[i] += arr[i-j] for i in range(imax): if i < window -1: h[i] = np.nan else: h[i] = buffer[i] return h

setup.py中要加入openmp的编译链接参数

EXT = Extension("*", ["para/*.pyx"], define_macros=[('CYTHON_TRACE', CYTHON_DEBUG), ('CYTHON_TRACE_NOGIL', CYTHON_DEBUG), ('CYTHON_BINDING', CYTHON_DEBUG), ("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION"), ('CYTHON_FAST_PYCCALL', '1')], extra_compile_args = ["-fopenmp" ], extra_link_args=['-fopenmp'], include_dirs=[".", np.get_include()])

性能比较

%timeit pd.Series(cpara.window_sum(X, 100)) 23.4 ms ± 325 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) %timeit ss.rolling(100).apply(np.sum,raw=True) 536 ms ± 3.96 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

536/23.4=22.9

测试环境:i3-7100U 2core 2T CPU, ubuntu 18.04 LTS

cython并行性能-计算滚动求和 rolling function的更多相关文章 easyui生成合并行,合计计算价格

easyui生成合并行,合计计算价格 注:本文来源: 原创 一:图样你效果图 二:代码实现 1:datagrid 列展示: window.dataGrid = $("#dataGrid&qu ...

python cython c 性能对比

我们用以下方法计算百万以上float型数据的标准偏差,以估计各个方法的计算性能: 原始python numpy cython c(由cython调用) python 原始方法: # File: Std ...

ForkJoin、并行流计算、串行流计算对比

ForkJoin 什么是 ForkJoin ForkJoin 是一个把大任务拆分为多个小任务来分别计算的并行计算框架 ForkJoin 特点:工作窃取 这里面维护的都是双端队列,因此但其中一个线程完成 ...

横向tab计算滚动位置

React横向滚动计算 class Footer extends React.Component { handleClick(e) { const offset = 150; // 指定偏移量 thi ...

.NET使用Task动态创建多任务多线程并行程序计算Redis集群keys计算

Task是一个很好用的多任务处理类,并且通过Task可以对任务进行很好的控制. 下面将通过代码实现Redis集群在使用IServer.keys时通过多任务对多个服务器示例进行并行计算,并对返回key做 ...

js滚动

有选择性的重复造一些轮子,未必是件坏事.Aaron的博客上加了一个悬浮菜单,貌似显得很高大上了.虽然这类小把戏也不是头一次见了,但是从未自己写过.今天就选择性的拿这个功能写一写.下面是这个轮子的开发过 ...

js的下拉刷新和上拉加载,基于iScroll v4.2.5

html部分



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3